package gdut.edu.demo01;

import java.util.Arrays;

/**
 * @Description 面向对象的数组
 * @Author JiaFu
 * @Date 2022/7/6 13:29
 */
public class MyArray {
    private int[] elements;

    public MyArray() {
        this.elements = new int[0];
    }

    public MyArray(int[] elements) {
        this.elements = elements;
    }

    //    获取数组长度
    public int size() {
        return this.elements.length;
    }

    //   向数组的末尾添加一个元素
    public boolean add(int element) {
//        创建一个新的数组，长度为原来数组长度+1
        int[] newArr = new int[this.elements.length + 1];
//        将原来数组的元素复制到新数组
        for (int i = 0; i < this.elements.length; i++) {
            newArr[i] = this.elements[i];
        }
//        在新数组末尾添加元素element
        newArr[newArr.length - 1] = element;
//        新数组替换旧数组
        this.elements = newArr;
        return true;
    }

    //    在指定位置插入一个元素
    public void add(int index, int element) {
//        判断下标合法性
        if (index < 0 || index > this.elements.length) {
            throw new RuntimeException("数组下标越界");
        }
//        创建新数组，长度为旧数组长度+1
        int[] newArr = new int[this.elements.length + 1];
//        遍历旧数组
        for (int i = 0; i < this.elements.length; i++) {
//        复制下标前面的所有元素到新数组
            if (i < index) {
                newArr[i] = this.elements[i];
            } else {
//        复制下标后面所有元素到新数组
                newArr[i + 1] = this.elements[i];
            }
        }
//        将元素插入到新数组指定下标
        newArr[index] = element;
//        新数组替换旧数组
        this.elements = newArr;
    }

    //    打印数组
    public void show() {
        System.out.println(Arrays.toString(this.elements));
    }

    //    在数组的末尾删除一个元素
    public boolean remove() {
//        创建新数组，长度为原来数组长度-1
        int[] newArr = new int[this.elements.length - 1];
//        将原来数组最后一个元素前的所有元素复制到新数组
        for (int i = 0; i < newArr.length; i++) {
            newArr[i] = this.elements[i];
        }
//        新数组替换旧数组
        this.elements = newArr;
        return true;
    }

    //    删除指定位置的一个元素
    public boolean remove(int index) {
//        判断下标合法性，防止数组下标越界
        if (index < 0 || index > this.elements.length - 1) {
            throw new RuntimeException("数组下标越界");
        }
//        创建新数组，长度为就数组长度-1
        int[] newArr = new int[this.elements.length - 1];
//        遍历新数组
        for (int i = 0; i < newArr.length; i++) {
//        复制待删除元素前的所有元素到新数组
            if (i < index) {
                newArr[i] = this.elements[i];
            } else {
//        复制待删除元素后所有元素到新数组
                newArr[i] = this.elements[i + 1];
            }
        }
//        新数组替换旧数组
        this.elements = newArr;
        return true;
    }

    //    同过下标获取元素
    public int get(int index) {
//        判断下标合法性
        if (index < 0 || index > this.elements.length - 1) {
            throw new RuntimeException("数组下标越界");
        }
        return this.elements[index];
    }

    //    修改指定位置的元素
    public boolean update(int index, int element) {
//        判断下标合法性
        if (index < 0 || index > this.elements.length - 1) {
            throw new RuntimeException("数组下标越界");
        }
        this.elements[index] = element;
        return true;
    }
}
